package com.qf.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.controller
 * @Description: 登录模块
 * @Date 2022/6/15 23:04
 */
@Controller
public class LoginController {
    /**
     * 用户登录
     * @param username 页面输入的用户名
     * @param password  页面输入的密码
     * @param rememberMe 页面勾选记住我
     * @return
     */
    @RequestMapping("/doLogin")
    public String doLogin(String username,String password,boolean rememberMe){
        //1.将页面输入的明文密码,进行md5加密
        Md5Hash md5Hash = new Md5Hash(password, username, 1024);

        //2.将页面输入的用户名,密码封装成shiro需要的用户名密码对象
        UsernamePasswordToken token = new UsernamePasswordToken(username, String.valueOf(md5Hash));

        //3.判断是否需要记住我,如果是,那么设置记住我选项
        if (rememberMe){
            token.setRememberMe(true);
        }

        //4.获取subject对象,这个是shiro框架的,当前登录用户对象
        Subject subject = SecurityUtils.getSubject();

        try {
            //5.调用当前登录对象的认证方法,将用户名,密码对象传入,让shiro进行认证
            // 调用了这个login方法的时候,那么shiro会自动执行自定义的realm类中的认证方法
            subject.login(token);

            //6.捕获如果有异常那么返回给用户错误提示
        } catch (AuthenticationException e) {
            return "/login.jsp";
        }
        //登录成功,跳转到首页
        return "/index.jsp";
    }

    @RequestMapping("/logout")
    public String logout(){
        //1.获取subject对象,当前登录用户对象
        Subject subject = SecurityUtils.getSubject();

        //2.调用退出的方法,清除shiro的session中保存的用户信息
        subject.logout();

        //3.跳转到登录页面,让用户重新登录
        return "/login.jsp";
    }
}
